//
//  IMNetworkUtils.h
//  DualMediationSDK
//
//  Created by YeJary on 2025/6/23.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

// 网络请求方法枚举
typedef NS_ENUM(NSInteger, IMNetworkMethod) {
    IMNetworkMethodGET = 0,
    IMNetworkMethodPOST,
    IMNetworkMethodPUT,
    IMNetworkMethodDELETE,
    IMNetworkMethodPATCH,
    IMNetworkMethodHEAD,
    IMNetworkMethodOPTIONS
};

// 网络错误类型枚举
typedef NS_ENUM(NSInteger, IMNetworkErrorType) {
    IMNetworkErrorTypeUnknown = 0,
    IMNetworkErrorTypeTimeout,
    IMNetworkErrorTypeNoInternet,
    IMNetworkErrorTypeServerError,
    IMNetworkErrorTypeClientError,
    IMNetworkErrorTypeCancelled,
    IMNetworkErrorTypeParsingError,
    IMNetworkErrorTypeSSLError
};

// 网络配置类
@interface IMNetworkConfig : NSObject

@property (nonatomic, copy) NSString *baseURL;              // 基础URL
@property (nonatomic, assign) NSTimeInterval timeoutInterval; // 超时时间（默认30秒）
@property (nonatomic, strong) NSDictionary *defaultHeaders; // 默认请求头
@property (nonatomic, assign) BOOL enableLogging;          // 是否启用日志（默认YES）
@property (nonatomic, assign) BOOL enableRetry;            // 是否启用重试（默认YES）
@property (nonatomic, assign) NSInteger maxRetryCount;     // 最大重试次数（默认3次）
@property (nonatomic, assign) NSTimeInterval retryInterval; // 重试间隔（默认2秒）
@property (nonatomic, strong) NSArray<NSString *> *acceptableContentTypes; // 可接受的内容类型

// 快速配置方法
+ (instancetype)defaultConfig;
+ (instancetype)debugConfig;
+ (instancetype)releaseConfig;

@end

// 网络响应类
@interface IMNetworkResponse : NSObject

@property (nonatomic, strong, readonly) id _Nullable data;  // 响应数据
@property (nonatomic, assign, readonly) NSInteger statusCode; // HTTP状态码
@property (nonatomic, strong, readonly) NSDictionary *headers; // 响应头
@property (nonatomic, strong, readonly) NSError *_Nullable error; // 错误信息
@property (nonatomic, assign, readonly) NSTimeInterval duration; // 请求耗时
@property (nonatomic, strong, readonly) NSString *requestID; // 请求ID（用于日志追踪）

// 初始化方法
- (instancetype)initWithData:(id _Nullable)data 
                  statusCode:(NSInteger)statusCode 
                     headers:(NSDictionary *_Nullable)headers 
                       error:(NSError *_Nullable)error 
                    duration:(NSTimeInterval)duration 
                   requestID:(NSString *_Nonnull)requestID;

@end

// 网络请求任务类
@interface IMNetworkTask : NSObject

@property (nonatomic, strong, readonly) NSString *taskID;   // 任务ID
@property (nonatomic, assign, readonly) BOOL isExecuting;  // 是否正在执行
@property (nonatomic, assign, readonly) BOOL isCancelled;  // 是否已取消

// 取消请求
- (void)cancel;

@end

// 回调block定义
typedef void(^IMNetworkSuccessBlock)(IMNetworkResponse *response);
typedef void(^IMNetworkFailureBlock)(IMNetworkResponse *response);
typedef void(^IMNetworkProgressBlock)(double progress);

/**
 * IM网络工具类
 * 
 * 基于AFNetworking的网络层封装，提供：
 * - RESTful API请求支持
 * - 自动重试机制
 * - 请求/响应日志记录
 * - 网络状态监控
 * - 文件上传/下载
 * - 请求缓存管理
 * - SSL证书验证
 * 
 * 使用示例：
 * ```objective-c
 * // 初始化
 * [IMNetworkUtils initWithConfig:[IMNetworkConfig defaultConfig]];
 * 
 * // GET请求
 * [IMNetworkUtils GET:@"/api/user/info" 
 *          parameters:nil
 *             success:^(IMNetworkResponse *response) {
 *                 NSLog(@"Success: %@", response.data);
 *             }
 *             failure:^(IMNetworkResponse *response) {
 *                 NSLog(@"Error: %@", response.error);
 *             }];
 * 
 * // POST请求
 * [IMNetworkUtils POST:@"/api/user/login"
 *           parameters:@{@"username": @"ywoeq0rgljb6ydjh", @"password": @"123456"}
 *              success:^(IMNetworkResponse *response) {
 *                  // 处理成功响应
 *              }
 *              failure:^(IMNetworkResponse *response) {
 *                  // 处理失败响应
 *              }];
 * ```
 */
@interface IMNetworkUtils : NSObject

#pragma mark - 初始化与配置

/**
 * 使用默认配置初始化网络工具
 */
+ (void)initialize;

/**
 * 使用自定义配置初始化网络工具
 * @param config 网络配置对象
 */
+ (void)initWithConfig:(IMNetworkConfig *)config;

/**
 * 获取当前网络配置
 */
+ (IMNetworkConfig *)currentConfig;

/**
 * 更新网络配置
 * @param config 新的配置对象
 */
+ (void)updateConfig:(IMNetworkConfig *)config;

#pragma mark - HTTP请求方法

/**
 * GET请求
 * @param URLString 请求URL（相对于baseURL）
 * @param parameters 请求参数
 * @param success 成功回调
 * @param failure 失败回调
 * @return 网络任务对象
 */
+ (IMNetworkTask *)GET:(NSString *)URLString
            parameters:(id _Nullable)parameters
               success:(IMNetworkSuccessBlock _Nullable)success
               failure:(IMNetworkFailureBlock _Nullable)failure;

/**
 * POST请求
 * @param URLString 请求URL
 * @param parameters 请求参数
 * @param success 成功回调
 * @param failure 失败回调
 * @return 网络任务对象
 */
+ (IMNetworkTask *)POST:(NSString *)URLString
             parameters:(id _Nullable)parameters
                success:(IMNetworkSuccessBlock _Nullable)success
                failure:(IMNetworkFailureBlock _Nullable)failure;

/**
 * PUT请求
 * @param URLString 请求URL
 * @param parameters 请求参数
 * @param success 成功回调
 * @param failure 失败回调
 * @return 网络任务对象
 */
+ (IMNetworkTask *)PUT:(NSString *)URLString
            parameters:(id _Nullable)parameters
               success:(IMNetworkSuccessBlock _Nullable)success
               failure:(IMNetworkFailureBlock _Nullable)failure;

/**
 * DELETE请求
 * @param URLString 请求URL
 * @param parameters 请求参数
 * @param success 成功回调
 * @param failure 失败回调
 * @return 网络任务对象
 */
+ (IMNetworkTask *)DELETE:(NSString *)URLString
               parameters:(id _Nullable)parameters
                  success:(IMNetworkSuccessBlock _Nullable)success
                  failure:(IMNetworkFailureBlock _Nullable)failure;

/**
 * 支付相关接口专用POST请求方法
 * 使用AES加密参数，Content-Type为text/plain
 * 仅用于支付相关接口：/api/inappios/verifyV2、/api/iap/acknowledge、/api/iap/unacknowledged
 * @param URLString 请求URL
 * @param parameters 请求参数
 * @param success 成功回调
 * @param failure 失败回调
 * @return 网络任务对象
 */
+ (IMNetworkTask *)postPaymentRequest:(NSString *)URLString
                           parameters:(id _Nullable)parameters
                              success:(IMNetworkSuccessBlock _Nullable)success
                              failure:(IMNetworkFailureBlock _Nullable)failure;

/**
 * 通用HTTP请求方法
 * @param method 请求方法
 * @param URLString 请求URL
 * @param parameters 请求参数
 * @param headers 额外的请求头
 * @param success 成功回调
 * @param failure 失败回调
 * @return 网络任务对象
 */
+ (IMNetworkTask *)request:(IMNetworkMethod)method
                 URLString:(NSString *)URLString
                parameters:(id _Nullable)parameters
                   headers:(NSDictionary *_Nullable)headers
                   success:(IMNetworkSuccessBlock _Nullable)success
                   failure:(IMNetworkFailureBlock _Nullable)failure;

/**
 * 内购专用POST请求
 * @param URLString 请求URL（相对路径，如 /api/iap/verify）
 * @param parameters 请求参数
 * @param success 成功回调
 * @param failure 失败回调
 * @return 网络任务对象
 */
+ (IMNetworkTask *)inAppPurchasePOST:(NSString *)URLString
                          parameters:(id _Nullable)parameters
                             success:(IMNetworkSuccessBlock _Nullable)success
                             failure:(IMNetworkFailureBlock _Nullable)failure;

#pragma mark - 文件操作

/**
 * 上传文件
 * @param URLString 上传URL
 * @param parameters 请求参数
 * @param fileData 文件数据
 * @param name 字段名
 * @param fileName 文件名
 * @param mimeType MIME类型
 * @param progress 进度回调
 * @param success 成功回调
 * @param failure 失败回调
 * @return 网络任务对象
 */
+ (IMNetworkTask *)uploadFile:(NSString *)URLString
                   parameters:(id _Nullable)parameters
                     fileData:(NSData *)fileData
                         name:(NSString *)name
                     fileName:(NSString *)fileName
                     mimeType:(NSString *)mimeType
                     progress:(IMNetworkProgressBlock _Nullable)progress
                      success:(IMNetworkSuccessBlock _Nullable)success
                      failure:(IMNetworkFailureBlock _Nullable)failure;

/**
 * 下载文件
 * @param URLString 下载URL
 * @param destination 目标路径
 * @param progress 进度回调
 * @param success 成功回调
 * @param failure 失败回调
 * @return 网络任务对象
 */
+ (IMNetworkTask *)downloadFile:(NSString *)URLString
                    destination:(NSString *)destination
                       progress:(IMNetworkProgressBlock _Nullable)progress
                        success:(IMNetworkSuccessBlock _Nullable)success
                        failure:(IMNetworkFailureBlock _Nullable)failure;

#pragma mark - 网络状态

/**
 * 获取当前网络状态
 * @return 网络状态描述
 */
+ (NSString *)networkStatus;

/**
 * 是否有网络连接
 */
+ (BOOL)isNetworkReachable;

/**
 * 是否是WiFi网络
 */
+ (BOOL)isWiFiNetwork;

/**
 * 开始网络状态监控
 * @param callback 状态变化回调
 */
+ (void)startNetworkMonitoring:(void(^)(NSString *status))callback;

/**
 * 停止网络状态监控
 */
+ (void)stopNetworkMonitoring;

#pragma mark - 请求管理

/**
 * 取消所有请求
 */
+ (void)cancelAllRequests;

/**
 * 取消指定URL的请求
 * @param URLString 请求URL
 */
+ (void)cancelRequestsWithURL:(NSString *)URLString;

/**
 * 获取当前活跃的请求数量
 */
+ (NSInteger)activeRequestCount;

#pragma mark - 缓存管理

/**
 * 设置缓存策略
 * @param policy 缓存策略
 */
+ (void)setCachePolicy:(NSURLRequestCachePolicy)policy;

/**
 * 清除所有缓存
 */
+ (void)clearCache;

/**
 * 获取缓存大小
 */
+ (NSString *)cacheSize;

#pragma mark - SSL配置

/**
 * 设置SSL验证模式
 * @param allowInvalidCertificates 是否允许无效证书
 * @param validatesDomainName 是否验证域名
 */
+ (void)setSSLValidation:(BOOL)allowInvalidCertificates
       validatesDomainName:(BOOL)validatesDomainName;

/**
 * 添加证书用于SSL验证
 * @param certificateData 证书数据
 */
+ (void)addSSLCertificate:(NSData *)certificateData;

#pragma mark - 调试工具

/**
 * 启用/禁用详细日志
 * @param enabled 是否启用
 */
+ (void)setVerboseLogging:(BOOL)enabled;

/**
 * 获取网络统计信息
 */
+ (NSDictionary *)networkStatistics;

/**
 * 导出网络日志
 * @param filePath 导出文件路径
 */
+ (BOOL)exportNetworkLogs:(NSString *)filePath;

@end

NS_ASSUME_NONNULL_END
